const Suit = cc.Enum({
    Spade: 1,     // 黑桃
    Heart: 2,    // 红桃
    Club: 3,    // 梅花(黑)
    Diamond: 4, // 方块(红)
})

const A2JQK = ['NAN', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];

/**
 * 扑克牌类，只用来表示牌的基本属性，不包含游戏逻辑，所有属性只读。
 * 因此全局只需要52个实例（不包括大小王），不论有多少副牌
 * @param point {Number} 1-13
 * @param suit {number} suit
 * @constructor
 */

function Card(point, suit) {
    Object.defineProperties(this, {
        // Data descriptors
        point: {
            value: point,
            writable: false,
        },
        suit: {
            value: suit,
            writable: false,
        },

        /**
         * id ,值在 0-51
         */
        id: {
            // 此处为什么不能用this.suit or this.point,因为没定义。。。
            value: (suit - 1) * 13 + (point-1),
            writable: false,
        },

        // accessor descriptor
        pointName: {
            get: function () {
                return A2JQK[this.point];
            }
        },
        suitName: {
            get: function () {
                return Suit[this.suit];
            }
        },

        // 黑色
        isBlockSuit: {
            get: function () {
                return this.suit === Suit.Spade || this.suit === Suit.Club;
            }
        },

        // 红色
        isRedSuit: {
            get: function() {
                return this.suit === Suit.Heart || this.suit === Suit.Diamond;
            }
        }

    })
}

Card.prototype.toString = function () {
    return this.suitName + ' ' + this.pointName;
};

// 存放52张扑克
const cards = new Array(52);

/**
 * 返回指定 id 的实例
 * @param id
 * @returns {any}
 */
Card.fromId = function (id) {
    return cards[id]; 
};  // <==！！！注意 此分号不能丢，丢了会报错 https://stackoverflow.com/questions/42036349/uncaught-typeerror-intermediate-value-is-not-a-function

// 初始化所有扑克牌
(function createCards() {
    for(let s = 1; s <= 4; s++) {
        for(let p = 1; p <= 13; p++) {
            const card = new Card(p, s);
            cards[card.id] = card;
        }
    }
})();

// 手中牌的状态
const ActorPlayingState = cc.Enum({
    Normal: -1,
    Stand: -1,  // 停牌
    Report: -1, // 报到
    Bust: -1,   // 爆了
});

// 输赢
const Outcome = cc.Enum({
    Win: -1,    // 赢了
    Lose: -1,   // 输了
    Tie: -1,    // 平局
});

// 牌型， 值越大越厉害
const Hand = cc.Enum({
    Normal: -1,     // 无
    BlackJack: -1,  // 黑杰克
    FiveCard: -1,   // 五小龙
})

module.exports = {
    Suit,
    Card: Card,
    ActorPlayingState,
    Hand,
    Outcome,
}